package cn.wolfcode.wolf2world.service.impl;

import cn.wolfcode.wolf2world.domain.UserInfo;
import cn.wolfcode.wolf2world.exception.LogicException;
import cn.wolfcode.wolf2world.redis.service.UserRedisService;
import cn.wolfcode.wolf2world.repository.UserInfoRepository;
import cn.wolfcode.wolf2world.service.UserInfoService;
import cn.wolfcode.wolf2world.utils.AssertUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;

/**
 * @author 杨兴健
 * @Date 2020/8/7 14:25
 */
@Service
@Slf4j
//@Transactional
public class UserInfoServiceImpl implements UserInfoService {

    @Autowired
    private UserInfoRepository userInfoRepository;
    @Autowired
    private UserRedisService userRedisService;

    @Override
    public void save(UserInfo userInfo) {
        log.info("新增用户:{}",userInfo);
        userInfoRepository.insert(userInfo);
        log.info("新增成功");
    }

    @Override
    public void update(UserInfo userInfo) {
        log.info("更新用户:{}",userInfo);
        userInfoRepository.save(userInfo);
        log.info("更新成功");
    }

    @Override
    public void delete(String id) {
        log.info("删除id为:{}的用户",id);
        userInfoRepository.deleteById(id);
        log.info("删除成功");
    }

    @Override
    public UserInfo get(String id) {
        log.info("获取id为:{}的用户信息",id);
        return userInfoRepository.findById(id).orElse(null);
    }

    @Override
    public List<UserInfo> list() {
        log.info("查询所有用户信息");
        return userInfoRepository.findAll();
    }


    /**
     * 校验注册手机号是否存在
     *
     * @param phone 注册手机号
     * @return true:存在   false:不存在
     */
    @Override
    public boolean checkPhone(String phone) {
        log.info("校验手机号码:{}是否可以注册",phone);
        UserInfo userInfo = userInfoRepository.findByPhone(phone);
        return userInfo != null;
    }

    /**
     * 注册用户
     *
     * @param phone      手机号码
     * @param nickname   昵称
     * @param password   密码
     * @param rpassword  确认密码
     * @param verifyCode 验证码
     */
    @Override
    public void regist(String phone, String nickname, String password, String rpassword, String verifyCode) {
        log.info("注册用户");
        //校验手机号码是否为空
        AssertUtil.notNull(phone, "手机号不能为空");
        //校验手机格式是否正确
        AssertUtil.phoneNum(phone, "手机号码格式不正确");
        //校验手机号码是否存在
        if (checkPhone(phone)) {
            throw new LogicException("手机号码已经存在");
        }
        //校验昵称是否为空
        AssertUtil.notNull(nickname, "昵称不能为空");
        //密码是否为空
        AssertUtil.notNull(password, "密码不能为空");
        //密码于确认密码是否一致
        AssertUtil.equal(password, rpassword, "确认密码于密码不一致");
        //验证码是否为空
        AssertUtil.notNull(verifyCode, "验证码不能为空");

        //校验验证码是否正确
        userRedisService.checkCode(phone, verifyCode);

        //创建用户
        UserInfo user = new UserInfo();
        user.setPhone(phone);
        user.setNickname(nickname);
        user.setEmail("");
        user.setPassword(password);
        user.setCity("");
        user.setHeadImgUrl("/images/default.png");
        user.setInfo("");
        user.setState(UserInfo.STATE_NORMAL);

        //保存在数据库
        userInfoRepository.insert(user);
        log.info("注册成功,用户信息为:{}",user);
    }

    /**
     * 登录用户
     *
     * @return 用户对象
     */
    @Override
    public UserInfo login(String phone, String password) {
        log.info("手机号{},的用户登录",phone);

        //判断手机号是否为null
        AssertUtil.notNull(phone, "手机号码不能为空");
        //判断密码是否为null
        AssertUtil.notNull(password, "密码不能为空");
        //判断用户名和密码是否正确
        UserInfo user = userInfoRepository.findByPhone(phone);
        if (user == null) {
            log.error("用户名不存在");
            throw new LogicException("用户名不存在");
        }
        if (!Objects.equals(user.getPassword(), password)) {
            log.error("密码错误");
            throw new LogicException("密码不正确");
        }
        user.setPassword("");
        return user;
    }

    /**
     * 根据城市名称查询用户
     * @param city
     * @return
     */
    @Override
    public List<UserInfo> queryByCity(String city) {
        return userInfoRepository.findByCity(city);
    }

    /**
     * 发送信息验证码
     * @param phone
     */
    @Override
    public void sendVerifyCode(String phone) {
        userRedisService.sendVerifyCode(phone);
    }


}
